package com.zjwd.system.service.impl;

import com.zjwd.common.constant.Constants;
import com.zjwd.common.core.domain.entity.SysPlatform;
import com.zjwd.common.core.domain.entity.SysPlatformUser;
import com.zjwd.common.utils.SecurityUtils;
import com.zjwd.common.utils.StringUtils;
import com.zjwd.system.mapper.SysPlatformMapper;
import com.zjwd.system.mapper.SysPlatformUserMapper;
import com.zjwd.system.service.ISysDeptService;
import com.zjwd.system.service.ISysPlatformService;
import com.zjwd.system.service.ISysRoleService;
import com.zjwd.system.service.init.RoleInitializationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 系统平台 服务层处理
 *
 * @author liquan
 */
@Service
public class SysPlatformServiceImpl implements ISysPlatformService {

    @Autowired
    private SysPlatformMapper platformMapper;

    @Autowired
    private SysPlatformUserMapper platformUserMapper;

    @Autowired
    private RoleInitializationService roleInitService;

    @Autowired
    private ISysDeptService deptService;

    /**
     * 查询系统平台数据集合
     *
     * @param platform 系统平台
     * @return 系统平台集合
     */
    @Override
    public List<SysPlatform> selectPlatformList(SysPlatform platform) {
        return platformMapper.selectPlatformList(platform);
    }

    /**
     * 根据用户账号查询系统平台
     *
     * @param userAccount 用户账号
     * @return 系统平台集合
     */
    @Override
    public List<SysPlatformUser> selectPlatformListByUser(String userAccount) {
        return platformUserMapper.selectPlatformListByUser(userAccount);
    }

    /**
     * 获取当前用户登录的系统平台
     *
     * @param userAccount 用户账号
     * @return 当前登录的系统平台
     */
    @Override
    public SysPlatformUser getCurrentLoginPlatform(String userAccount) {
        return platformMapper.getCurrentLoginPlatform(userAccount);
    }

    /**
     * 校验系统平台编号是否唯一
     *
     * @param platform 系统平台
     * @return 结果
     */
    @Override
    public boolean checkCodeUnique(SysPlatform platform) {
        Integer id = StringUtils.isNull(platform.getId()) ? -1 : platform.getId();
        SysPlatform info = platformMapper.checkCodeUnique(platform.getCode());
        if (StringUtils.isNotNull(info) && !info.getId().equals(id)) {
            return Constants.NOT_UNIQUE;
        }
        return Constants.UNIQUE;
    }

    /**
     * 校验系统平台名称是否唯一
     *
     * @param platform 系统平台
     * @return 结果
     */
    @Override
    public boolean checkNameUnique(SysPlatform platform) {
        Integer id = StringUtils.isNull(platform.getId()) ? -1 : platform.getId();
        SysPlatform info = platformMapper.checkNameUnique(platform.getName());
        if (StringUtils.isNotNull(info) && !info.getId().equals(id)) {
            return Constants.NOT_UNIQUE;
        }
        return Constants.UNIQUE;
    }

    /**
     * 切换系统平台
     *
     * @param platformCode 系统平台编号
     * @param userAccount 用户账号
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public SysPlatformUser switchPlatform(String platformCode, String userAccount) {
        // 更新选择的系统平台当前登录状态为Y
        platformUserMapper.updateCurrentLoginPlatform(platformCode, userAccount);
        // 更新其他的系统平台当前登录状态为N
        platformUserMapper.updateLoginStatusOtherPlatform(platformCode, userAccount);
        // 更新缓存
        return platformMapper.getCurrentLoginPlatform(userAccount);
    }

    /**
     * 新增
     *
     * @param platform 系统平台
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insert(SysPlatform platform) {
        platformMapper.insert(platform);
        // 初始化默认角色，包含：管理员，施工单位，监理单位，业主单位，劳务工角色
        roleInitService.initializePlatformRoles(platform.getCode());
        // 将当前用户分配到系统平台用户表中（作为管理员）
        SysPlatformUser platformUser = new SysPlatformUser();
        platformUser.setPlatformCode(platform.getCode());
        platformUser.setUserAccount(SecurityUtils.getUsername());
        platformUser.setIsAdmin(Constants.YES);
        platformUser.setCurrentLogin(Constants.NO);
        platformUser.setCreateBy(SecurityUtils.getUsername());
        platformUserMapper.insert(platformUser);
        // 创建未分配部门，将用户加入该部门
        deptService.initPlatformDept(platform.getCode(), platform.getName());
        return 1;
    }



}
